注意: csrf_token验证只作用于POST的请求,GET等其他请求Django都会不进行验证,所以POST请求除外的都无需设置csrf_token
模板相关
- csrf_token的作用: 跨站请求伪造保护,且一般用于form表单的POST请求中
- csrf_token的通俗理解: 例如,有一个名为A的网址,如果没有设置csrf_token,那么任何网站都可以往这个A网址进行表单提交,如果设置了csrf_token 那么他就会只允许A网址的本站进行表单提交,其他网站对A网址进行表单提交都会无效
- csrf_token的原理: 它会通过{% csrf_token %}生成一个input,且input的value就是本次form表单的唯一标识(每次刷新页面都会不一样),在进行表单提交的时候一并将该标识提交给后台,然后Django会自动验证该标识是否正确

- 注意: 在刚开始我们所注释配置文件 settings.py 中的 csrf 配置项就是在表单提交的时候不进行 csrf 验证,但是在正常开发中不能把它注释掉,且在form表单中一定要加上 {% csrf_token %} 不然就会报错
<form action="/view_fn/" method="post">
{% csrf_token %}
<input type="text" name="uname">
<input type="submit" value="提交">
</form>
- 不加 {% csrf_token %} 的报错

视图相关
- csrf_exempt 装饰器 -> 不验证当前视图函数的 csrf_token
# views.py
from django.views.decorators.csrf import csrf_exempt, csrf_protect
@csrf_exempt
def view_fn(request):
return render(request, 'view_fn.html')
- csrf_protect 装饰器 -> 验证当前视图的 csrf_token,前提是当 settings.py 中的 csrf 配置被注释掉
# views.py
from django.views.decorators.csrf import csrf_exempt, csrf_protect
@csrf_protect
def view_fn(request):
return render(request, 'view_fn.html')